package com.cn.wanxi.util;

import java.util.Hashtable;

public class MyHelp {
    /**
     * 2021-10-13 数据库
     * 1.数据库是什么？数据库一般有哪些？数据库的分类？
     * 2.为什么要学数据库？数据库的作用？
     * 3.数据库的应用场景？
     * --------------------------------------------------------
     * 1.下载安装 配置环境变量
     * 2.连接数据库（界面化工具 workbench navicat  sqlyong）
     * 3.创建数据自己的数据库
     * 4.数据库的命名规范？
     *      1）数据库名称：全小写 一般和项目名一致
     *      CREATE SCHEMA `canyin` ; 创建数据库名位canyin
     * ------------------------
     * charset  字符设置
     * utf-8和utf-8mb4去区别？
     * 为什么不推荐使用存储过程？
     * 对象与对象之间的关系？类与类之间的关系？
     * 类可以继承类，可以继承接口？可以继承抽象类？
     * 接口可以继承接口？接口可以实现接口嘛？接口可以继承抽象类？
     * 注意：普通类只能实现接口，接口和接口只能继承，其他都是继承
     * 接口和抽象的目的：实现多态
     * 泛化（继承，实现）
     * 依赖
     * 关联（聚合，组合）
     * 一对一   1  1
     * 一对多   1  *   一个菜系对应多个产品
     * 多对一   *   1
     * 多对多   *  *
     * 数据建模---概念建模（需求）  逻辑建模（数据库）  物理建模（Java）
     *          建模工具：项目经理，产品经理，架构师
     *          rose 和 powerdesigner区别？
     * 数据引擎：innoDB
     * innodb和myisam的区别？
     * 事务？事务应该具有4个属性：原子性、一致性、隔离性、持久性。原子性
     * id主键
     * create-time 创建时间
     * update_time更新时间
     * enable  数据是否能使用 1 数据正常 0表示数据异常
     * remark  备注
     */
    /**
     * CREATE SCHEMA `canyin` ; -- 区分关键字
     * create database `user`;
     * -- SCHEMA和database一样
     * # 注释
     * -- tables 表
     * -- views 视图
     * -- stored procedures  存储过程
     * -- functions  函数
     * -- 表 根据什么来创建？怎么创建？需要遵循什么原则？表主要用于做什么？
     * -- 表和model有关   表其实是一个对象  一对一的关系
     * -- 表和表之间的关系？
     * -- 模型--- 概念模型   数据模型 物理模型
     * -- 三大范式  五大约束
     * --  原子性， 最小原则  不可以再次拆分
     * -- 唯一性  需要有主键
     * -- 取消外键   不存在依赖关系
     *
     * -- id主键
     * -- create-time 创建时间
     * -- update_time更新时间
     * -- enable  数据是否能使用 1 数据正常 0表示数据异常
     * -- remark  备注
     * -- 数据库有哪些整型的数据类型？
     * -- char（500）和varchar（500）的区别？
     * -- int 为什么用int？ int的取值范围？
     *
     * -- datetime 和TIMESTAMP的区别？
     * -- 如果是字符 ？什么时候用char 什么时候用varchar？什么时候用text？
     * -- 定长的时候，字符比较少的时候用char
     * -- 变长的时候用varchar
     * -- 字符太长用text
     *
     * select date_format(now(),'%y------%m/%d');
     * use canyin;-- 选中数据库
     * CREATE TABLE `product` (
     *   `id` INT NOT NULL,
     *   `name` VARCHAR(45) NULL,
     *   `normal_price` DECIMAL(6,2) NULL,
     *   `market_price` DECIMAL(6,2) NULL,
     *   `imgHref` VARCHAR(45) NULL,
     *   `content` TEXT NULL,
     *   `cuisine_id` INT NULL,
     *   `create_time` TIMESTAMP NULL,
     *   `update_time` DATETIME NULL,
     *   `enable` TINYINT NULL,
     *   `remark` VARCHAR(45) NULL COMMENT 'id主键\ncreate-time 创建时间\nupdate_time更新时间\nenable  数据是否能使用 1 数据正常 0表示数据异常\nremark  备注',
     *   PRIMARY KEY (`id`))
     * ENGINE = InnoDB;
     */
    /**
     * 2021-10-14 数据库查询
     * -- create table 表明（列名 列类型 默认值）
     * CREATE TABLE `product` (
     *   `id` INT NOT NULL AUTO_INCREMENT ,
     *   `name` VARCHAR(45) NULL,
     *   `normal_price` DECIMAL(6,2) NULL,
     *   `market_price` DECIMAL(6,2) NULL,
     *   `imgHref` VARCHAR(45) NULL,
     *   `content` TEXT NULL,
     *   `cuisine_id` INT NULL,
     *   `create_time` TIMESTAMP NULL,
     *   `update_time` DATETIME NULL,
     *   `enable` TINYINT NULL,
     *   `remark` VARCHAR(45) NULL COMMENT 'id主键\ncreate-time 创建时间\nupdate_time更新时间\nenable  数据是否能使用 1 数据正常 0表示数据异常\nremark  备注',
     *   PRIMARY KEY (`id`))
     * ENGINE = InnoDB;
     * -- 更改，修改
     * ALTER TABLE `canyin`.`product`
     * CHANGE COLUMN `id` `id` INT NOT NULL AUTO_INCREMENT ;
     *
     * ALTER TABLE `canyin`.`product`
     * CHANGE COLUMN `content` `contents` VARCHAR(255) NULL DEFAULT '' ;
     *
     * INSERT INTO `product`
     * (`name`, `normal_price`, `market_price`, id,
     * `imgHref`, `content`, `cuisine_id`,
     *  `create_time`, `update_time`, `enable`, `remark`)
     *  VALUES ('1', '1', '1',20,
     *  '1', '1', '1',
     *  now(), sysdate(), '1', '1');
     * -- update 表明  set  列名=值（数字可以不加引号，字符串必须加引号） where
     * UPDATE `product` SET
     * `name` = '2', `normal_price` = '2', `market_price` = '2',
     * `imgHref` = '2', `contents` = '2',
     *  `create_time` = '2021-12-14 14:20:17', `update_time` = '2022-10-14 14:20:17',
     *  `enable` = '2', `remark` = '2'
     *  WHERE (`id` = '27');
     *
     *  --- 删除 ,更新和删除一定要有条件
     *  delete from product where id=27;  -- 删除表数据
     *  --
     *  truncate product; -- 删除表数据
     *  drop table product;  -- 删除表
     *  -- 查询
     *
     *  select * from product where id <4 or name='2';
     *   select * from product where  id >= 2 and id<= 22;
     *  select * from product where  id between 2 and 22;
     *  select * from product where id not in (4);
     *  -- 模糊查询
     * SELECT * FROM canyin04.user where username like '%aaa%';
     * SELECT * FROM canyin04.user where username like '%a%'  and  address like '%b%' ;
     * SELECT * FROM canyin04.user where username REGEXP '[a]d';
     * SELECT * FROM canyin04.user where username like '%a%'  and  address like '%b%' ;
     * SELECT * FROM canyin04.user where username like '_d%';
     * -- ^ 必须放在第一个，如果放在后面 则表示一个普通的字符
     * SELECT * FROM canyin04.user where username REGEXP '[^a]d';
     * -- 排序 order by
     * select * from product order by create_time desc,enable asc;
     * -- 分组  group by
     * -- 子查询
     * select * from (select * from product where id<33   order by id desc ) as a  group by  a.enable;
     * -- 收到客户端{pageNo:1,pagesize:10}
     * -- select * from table limit (pageNo-1)*pageSize, pageSize;
     * -- 第二页 ，每页显示3条
     * -- mysql 分页不支持表达式
     * select * from product limit 3,3;
     * -- as  取别名 可以省略
     * select min(id)  id from product;
     *
     * -- 多表查询
     * SELECT p.*,c.name cuisineName FROM product as p
     * ,cuisine  as c
     * where p.cuisine_id=c.id ;
     *
     * --    内连接
     * select p.*,c.* FROM product as p
     * inner join cuisine  as c
     * on p.cuisine_id=c.id ;
     *
     * -- 左外连接
     * select p.*,c.* FROM product as p
     * left join cuisine  as c
     * on p.cuisine_id=c.id ;
     *
     * select c.*,p.* FROM  cuisine  as c
     * left join  product as p
     * on p.cuisine_id=c.id ;
     *
     * -- 右连接
     * select p.*,c.* FROM product as p
     * right join cuisine  as c
     * on p.cuisine_id=c.id ;
     *
     *
     * select price from product group by  price having price>500;
     *
     *
     * (select * from product where is_show =1 limit 2)
     * union
     * (select * from product where is_recommend =1 limit 2)
     * union
     * (select * from product  where is_show=0 or is_recommend=0 limit 6);
     *
     * select * from product   where id=(select min(id) from product where id>20)
     * union all
     * select * from product where id=20
     * union all
     * select * from product   where id=(select max(id) from product where id<20)
     */
    /**
     * 2021-10-15 js基础
     * //js 基础
     * // 数据类型：字符串值，数值，布尔值，数组，对象。
     * // java  String    （byte  short  int  long float  double）  true false
     * //java   String [] aa= {};
     * //java  String aa=new String();
     * //-----------------------------------
     * //js 定义
     * // var  let  const
     * // var age1 = 17; // 数值
     * // let age2=18;
     * // const age3=19;
     * // var name = "supeng";//字符串 ,不区分单双引号
     * // var isMale = true;
     * // var object = {
     * //     name: 'lily',
     * //     age: 18,
     * //     isMale: true,
     * //     //匿名方法
     * //     money: function () {
     * //         return 10;
     * //     }
     * // };
     * //数组 ,集合
     * // var hobby = ["足球", "java",2, object];
     * //function 定义方法必须要加
     * // function getName(data,age) {
     * //     var age11 = 17; // 数值
     * //     let age22=18; // 变量
     * //     const age33=19;// 常量,不能再次进行赋值
     * //     age22=20;
     * //     return true;
     * // }
     *
     * //  var a;
     * // console.log(a,"--------------");
     * //  //undefined 默认值
     * //  let b;
     * // console.log(b,"+++++++++++");
     * // $(function () {
     * // });
     *
     * //----------------------------- 数组类型的方法
     * //字符
     * //Java String 有哪些方法？
     * // length;
     * //js: 请注意 (x==y) 与 (x===y) 的区别。?
     * // java: 请注意 (x==y) 与 (x===y) 的区别。?
     */
    /**
     * 2021-10-18 验证码 正则表达式 layui入门
     *
     *
     *
     */
    /**
     * 2021-10-19 登录 前端逻辑
     * 1.页面访问后台的两种方式
     * 2.后台怎么取得前端的值
     * 3.后台怎么转换json数据
     * 4.前端js逻辑判断
     *  console.log(data, "success");
     *                     if (data.msg == 'success') {
     *                         location.href = 'index.html';
     *                     } else if (data.msg == 'error-code') {
     *                         layer.msg("你的验证码输入不正确，请重新输入");
     *                     } else {
     *                         layer.msg("你的用户名或者密码不正确，请重新输入");
     *                     }
     * 5.后台需要返回给前端的统一数据格式ResultModel
     * 7.将所有关于逻辑的代码提取到service层
     * 8.手写JDBC工具类
     * 9.dao层数据封装
     * ------------------------------
     * js--》servlet--》service--》dao
     */
    /**
     * 2021-10-20 登录前后端传值
     * 1.js 页面之间相互传值  三种   web（session  local）
     * 2.时间格式化
     * 3.一个页面最好只有一个id，
     * 4.查询
     *      1）undefined
     *      2）乱码
     *      3）三元运算符   注意括号
     *      4）注意字符串拼接
     */
    /**
     * 2021-10-21 用户新增
     * 1.写页面
     * 2.写js
     *      1）复选框取值
     *      2）弹出日期输入框点击
     *      3）jQuery取得属性的值$(this).attr("title")
     *      -------------------------
     * 3.java后台
     * servlet
     *      1）乱码处理
     *      2）取得前端的值
     *      3）封装数据
     *      4）调用逻辑服务层
     *      5）返回页面数据
     * service
     *      1)更新调用dao层
     *      2）根据返回的值设置msg
     * dao
     *      1）封装sql语句
     *      2）调用jdbc
     *
     */
    /**
     * 2021-10-22 编辑 赋值 删除
     * 1.通过点击编辑按钮拿到id
     * 2.通过id向数据库查询数据
     * 3.将数据赋值到页面上
     * 4.修改需要重新赋值的数据
     * 5.点击编辑按钮进行编辑
     * 页面--js--servlet--service--dao
     *
     */
    /**
     * 2021-10-25 自定义图标  编辑密码和状态
     * 1.编辑密码
     * 2.编辑状态
     * 都是对数据的修改   可以直接用修改的后台代码
     * 注意：状态的前端逻辑复杂
     * 3.自定义图标
     * 1）注册阿里自定义图标
     * 2）下载
     * 3）引入css
     * 4）引入i标签 注意 class  iconfont
     * 4.分页：
     *  1）div页面
     *  2）js layui分页js
     *  3）查询总条数
     *  注意：需要返回一个数据的Ajax
     *  4）需要传递当前第几页和每页显示多少天
     */
    /**
     * 2021-10-26 模糊查询
     * 1.页面
     * 2.js   需要将分页单独提取出来，因为模糊查询也会查询所有
     * 3.需要对查询所有传递模糊查询所需要的数据
     * 4.两个对象合并
     * 5.PreparedStatement和Statement的区别？ sql注入？
     * 6.find_in_set  逻辑关系  注意：如果是or 必须加（）
     */
    /**
     * 2021-10-27   动态赋值  如果想要显示自定义的样式 用templet
     * 1.遇到问题：重启
     * 2.清除缓存：
     * 3.查询总条数和查询所有（分页）的条件应该一直
     *---------------------------------------------------------
     * 1.复制table  <table class="layui-hide" id="list" lay-filter="test"></table>
     * 2.复制js代码   layui.use('table', function () {    table.render({
     * 3. 写后台代码  ：返回list和count
     * 4.如果想要操作按钮   <script type="text/html" id="barDemo">
     * 5.如果想要模板 <script type="text/html" id="switchTpl">
     */
    /**
     * 2021-10-28  产品增加 编辑
     * 1.产品增加 ---对菜系进行赋值
     * 2.后台提供公共接口
     * 3.将后台所有代码进行实现（所有的model ）(就是给前端提供一个接口)
     * 4.最重要的sql语句
     * ---------------------------
     * 5.文件上传  js 部分和返回值对象格式
     */
    /**
     * 2021-10-29 文件上传
     * java 代码部分
     */
    /**
     * 2021-11-1 富文本  返回值对象里面必须将状态码变为0
     *  layui
     *  1.在js里面加 代码
     *   layedit = layui.layedit;
     *     layedit.set({
     *         uploadImage: {
     *             url: '/upload' //接口url
     *             // , type: 'post' //默认post
     *         }
     *     });
     *     //注意：layedit.set 一定要放在 build 前面，否则配置全局接口将无效。
     *     index = layedit.build('content'); //建立编辑器
     *  2.在html里面加  <textarea name="content" id="content" style="display: none;"></textarea>
     *  3.在添加按钮里面增加一个属性，得到富文本里面的值
     *  data.content = layedit.getContent(index);
     */
    /**
     * 2021-11-12 session认证
     * 如果不做，则随便那个用户都可以直接访问后台管理系统 造成数据不安全
     * 前端：
     *  1.当用户刷新当前页面时，需要判断当前是否已经登录
     *  2.当用户点击按钮的时候，也需要判断用户是否已经登录
     *  -------------------------------------
     * 页面加载完成执行里面的代码
     *     //判断当前用户是否已经登录
     *     //如果已经登录，则可以往后面执行
     *     //如果没有登录，则跳转到登录页面进行登录
     * ----------------------------------
     * 当用户直接点击操作按钮时，要判断是否已经登录
     *  在条用方法之前需要调用isLogin();
     * -----------------------------------------------
     * 后端：
     *      如果违规人员 直接通过地址（api，后台提供给前端的接口）进行调用，那怎么办？
     *      提供一个公共的方法？
     *       if (!IsLoginServlet.isLogin(req, resp)) {
     *             return;
     *         }
     *  -----------------------------------------------
     *  上面的方法不好？
     *  需要修改所有servlet的代码 ，都需要添加判断
     *  添加过滤器
     *  1.需要过滤的api地址  访问后台的地址
     *          不需要过滤前端的地址，
     *          不需要过滤code的地址
     *          登录也不需要过滤
     * ----------------------------------------------
     * 总结：session认证 需要考虑的两个地方
     * 1.前端 加一个公共js，每次访问都需要调用判断方法
     * 2.后台 加一个过滤器
     * -------------------------------------
     * 产品模糊查询   需要讲查询单独提取出来 ，设置 前端传递给后台的数据
     *  , where: data
     *  如果想打印后台传递给前端的值：
     *   , parseData: function (res) { //res 即为原始返回的数据
     *                 console.log(res);
     *                 return {
     *                     "code": res.code, //解析接口状态
     *                     "msg": res.msg, //解析提示文本
     *                     "count": res.count, //解析数据长度
     *                     "data": res.data //解析数据列表
     *                 };
     *             }
     *----------------------------------------------------
     * 富文本和文件上传：
     * 前端拿不到值 或者上传失败，需要对后端添加一个code=0
     *  resultModel.setCode(0);
     *  发送邮件需要你们去做
     *
     */
    /**
     * 2021-11-15 前端赋值
     * 1.面向对象   将top和foot分开
     * 2.点击菜系应该可以重新查询数据
     */
    /**
     * 2021-11-16 产品页面，上一页下一页
     * 1.2条热点，2条置顶，4条普通
     * 2.上一个，下一个
     * 3.对单个div进行设置样式
     */

    /**
     * 2021-11-19 第五阶段 redis非关系型数据库
     * 1.是什么？
     * 2.可以用来做什么？应用场景
     * 3.有什么优势？
     * 4.怎么做？
     * ----------------------------------------------------
     * Java  有key，value的有哪些？
     * 四大作用域   page，request session application
     * map  set   hashmap
     *  Hashtable 和map和Hashmap的区别？
     *--------------------------------------------------
     * MySQL  事务的特性？四个
     * 原子性   要么成功要么失败
     * 一致性  Java中是保存什么，在数据库里面就保存什么
     * 隔离性  两个事务不相互影响
     * 持久性  可以永久保存
     *----------------------------------------------------
     * 要用数据库？首先做什么？
     * 1.下载数据库（redis）
     * 2.安装 配置
     * -----------------------------------
     * 3.是配置服务？
     * 4.连接数据库 有两种（通过命令行，通过可视化界面）RedisDesktopManager
     * ---------------------------------------------------
     * java String的长度？ int  l理论上
     * 2.要编译后加入常量池 utf8_info的形式，然后长度是数组bytes[]的长度 类型u2，2个字节 65535
     * 当大量用户访问网站的时候，10万同时访问？
     * 1.分解   10万人    10个1万    10个1千人   100台服务器（集群）
     * 2.削峰   在十万人中取十个人 其他人都不能进入Java后台，（取首先访问我的十个人，或者随机）
     * 3.用其他技术  redis    es   mq 。。。。。
     * ----------------------------------------------------------
     * 只能第一次去取数据库，然后后面的人全部取缓存（redis）数据
     * 1.看redis里面是否有数据
     * 2.如果没有，则取数据库数据，放入到缓存
     * 3.如果有，则直接取缓存数据
     * -----------------------------------------------------
     * 如果管理员修改了数据，肯定也想实时修改redis里面的数据
     * 所以，当管理员更新了数据，则将数据redis里面删除
     * 手动删除redis里面的数据
     * -----------------------------
     * 对于导航 也是和公司信息步骤差不多
     */

//    public static void main(String[] args) {
//        String bb = new MyHelp().bb();
//    int i=0;
//        System.out.print(bb);
//    }

//    public String bb() {
//
//        final String[] aa = {""};
//        ITest iTest = new ITest() {
//            @Override
//            public String aa() {
//                aa[0] = "1";
//                return aa[0];
//            }
//        };
//        return aa[0];
//    }
}
